package xyz.labmem.lipx.core.console.enums

import xyz.labmem.lipx.core.AppContext
import xyz.labmem.lipx.core.console.Control
import xyz.labmem.lipx.core.tool.ConsoleTable
import xyz.labmem.lipx.core.util.ClientConfigDataUtil

/**
 * @description: do something
 * @author: ltty
 * @date: 2022/8/9 11:41
 */
enum class DisplayClient : DisplayEnum {

    ADD_NAME,//新增连接
    ADD_GROUP_NAME,//新增分组名称
    ADD_SERVER_HOST,//新增服务器host
    ADD_SERVER_PORT,//新增服务器端口
    ADD_PROXY_HOST,//新增代理host
    ADD_PROXY_PORT,//新增代理端口
    ADD_TARGET_PORT,//新增转发端口
    ADD_PASSWORD,//新增密码
    ADD_WLS,//新增白名单
    ADD_AUTO,//新增自动
    ADD_TYPE,//新增模式
    SAVE,//保存
    LIST,//连接列表
    INFO;//连接详情

    override fun getName(): String = "client/${this.name}"

    /**
     * 展示内容
     */
    override fun content(): String {
        return when (this) {
            INFO -> {
                return """
                    [name]  连接名称 : ${AppContext.Client.infoCache?.remark} 
                    [group] 分组名称 : ${AppContext.Client.infoCache?.group} 
                    [type]  代理模式(1:正向代理 2:反向代理) : ${AppContext.Client.infoCache?.type?.getCN()} 
                    [sip]   服务器HOST : ${AppContext.Client.infoCache?.serverHost} 
                    [spt]   服务器端口 : ${AppContext.Client.infoCache?.serverPort} 
                    [pip]   代理HOST : ${AppContext.Client.infoCache?.proxyHost} 
                    [ppt]   代理端口 : ${AppContext.Client.infoCache?.proxyPort}
                    [tpt]   转发端口 : ${AppContext.Client.infoCache?.targetPort}
                    [pwd]   密码 : ${AppContext.Client.infoCache?.password}
                    [auto]  自动连接 : ${AppContext.Client.infoCache?.autoRun}
                    [wls]   访问白名单 : ${AppContext.Client.infoCache?.wls.toString()}
                """.trimIndent()
            }

            LIST -> {
                ClientConfigDataUtil.refreshList()
                var title =
                    "_分组________________________________________________________________________________________________________\n"
                var lines = 0
                AppContext.Client.groupList.forEachIndexed { i, s ->
                    val s1 = "${if (i == Control.checkGroup) "【${i}_$s】     " else "${i}_$s     "} "
                    title += s1
                    if (lines >= 90) {
                        title += "\n"
                        lines = 0
                    } else if (i == AppContext.Client.groupList.size - 1)
                        title += "\n"
                    else
                        lines += s1.length
                }

                return title + ConsoleTable.create().addHeader(
                    "id",
                    "连接名称",
                    "代理模式",
                    "服务器HOST",
                    "服务器端口",
                    "代理HOST",
                    "代理端口",
                    "转发端口",
                    "状态",
                    "版本",
                ).apply {
                    AppContext.Client.allList.forEach { (i, t) ->
                        if (t.group == AppContext.Client.groupList[Control.checkGroup])
                            addBody(
                                i,
                                t.remark ?: "",
                                t.type!!.getCN(),
                                t.serverHost ?: "",
                                t.serverPort.toString(),
                                t.proxyHost ?: "",
                                t.proxyPort.toString(),
                                (t.targetPort ?: "不转发").toString(),
                                t.status.getCN(),
                                t.version ?: "",
                            )

                    }
                }.toString()
            }

            ADD_NAME -> "请下面说明输入相应内容  输入'!Q'可退出添加 输入'!R'重新填写"
            ADD_GROUP_NAME -> ""
            ADD_SERVER_HOST -> ""
            ADD_SERVER_PORT -> ""
            ADD_PROXY_HOST -> ""
            ADD_PROXY_PORT -> ""
            ADD_TARGET_PORT -> ""
            ADD_PASSWORD -> ""
            ADD_WLS -> ""
            ADD_AUTO -> ""
            ADD_TYPE -> ""
            SAVE -> """
                    连接名称 : ${Control.cacheConfig?.remark} 
                    分组 : ${Control.cacheConfig?.group} 
                    代理模式 (1:正向代理 2:反向代理): ${Control.cacheConfig?.type?.getCN()} 
                    服务器HOST : ${Control.cacheConfig?.serverHost} 
                    服务器端口 : ${Control.cacheConfig?.serverPort} 
                    代理HOST : ${Control.cacheConfig?.proxyHost} 
                    代理端口 : ${Control.cacheConfig?.proxyPort}
                    转发端口 : ${Control.cacheConfig?.targetPort}
                    密码 : ${Control.cacheConfig?.password}
                    自动连接 : ${Control.cacheConfig?.autoRun}
                    访问白名单 : ${Control.cacheConfig?.wls.toString()}
                """.trimIndent()
        }
    }

    /**
     * 操作提示
     */
    override fun hint(): String {
        return "tips: " + when (this) {
            INFO -> "编辑[edit 'key' 'val'] 保存[save] 返回[back]"
            LIST -> """
                [group 'i']切换分组 [new]新增连接 [info 'id']连接详情 [del 'id']删除连接 
                      [start 'id' or all]启动连接 [cut 'id' or all]断开连接 [r]刷新 [back]返回上级
                """.trimIndent()

            ADD_NAME -> "请输入'连接名称' 可空"
            ADD_SERVER_HOST -> "请输入'服务器HOST' 非空"
            ADD_SERVER_PORT -> "请输入'服务器端口' 非空"
            ADD_PROXY_HOST -> "请输入'代理HOST' 默认'127.0.0.1'"
            ADD_PROXY_PORT -> "请输入'代理端口' 非空"
            ADD_TARGET_PORT -> "请输入'转发端口' 非空"
            ADD_PASSWORD -> "请输入'服务器密码' 可空"
            ADD_WLS -> "请输入'代理白名单' 可空 以英文逗号隔开！"
            SAVE -> "请确认信息后输入【y/n】保存"
            ADD_GROUP_NAME -> "请输入'分组名称' 可空"
            ADD_AUTO -> "是否自动连接，请输入true/false 默认false"
            ADD_TYPE -> "代理模式，请输入'1:正向代理 2:反向代理' 非空"
        }
    }

    override fun keys(): List<String> {
        return when (this) {
            LIST -> listOf(
                "group",
                "g",
                "new",
                "info",
                "i",
                "del",
                "d",
                "start",
                "cut",
                "back",
                "r",
                "./",
                "copy",
                "cp",
                "n", "s", "c"
            )

            INFO -> listOf("edit", "save", "back", "./")
            ADD_NAME -> listOf("{input}", "!Q", "!R")
            ADD_GROUP_NAME -> listOf("{input}", "!Q", "!R")
            ADD_SERVER_HOST -> listOf("{input}", "!Q", "!R")
            ADD_SERVER_PORT -> listOf("{input}", "!Q", "!R")
            ADD_PROXY_HOST -> listOf("{input}", "!Q", "!R")
            ADD_PROXY_PORT -> listOf("{input}", "!Q", "!R")
            ADD_TARGET_PORT -> listOf("{input}", "!Q", "!R")
            ADD_PASSWORD -> listOf("{input}", "!Q", "!R")
            ADD_WLS -> listOf("{input}", "!Q", "!R")
            SAVE -> listOf("y", "n", "")
            ADD_AUTO -> listOf("true", "false", "", "!Q", "!R")
            ADD_TYPE -> listOf("1", "2", "!Q", "!R")
        }

    }

}